'''
Created on 5 dec. 2014

@author: Damien Torond et Geoffrey Sentost
Module Client
'''

class Client:
    
    '''
    Classe Client qui modelise un client lambda, avec ses donnees personnelles, la frequence 
    de venu au parking ainsi que son abonnement si il en a un.
    '''
    
    def __init__(self, voiture, nom, prenom, adresse, mail, tel, nbFreq, id, abonnement = None):
        '''
        Attributs :
            - id de type int.
            - nom de type string, nom du client.
            - prenom de type string, prenom du client.
            - adresse de type string, adresse du client.
            - mail de type string, adresse mail du client.
            - tel de type string, numero de telephone du client.
            - nbFrequentations de type int, le nombre de fois ou le client va au parking.
            - possederTicket de type bool qui verifie si le client a un ticket (True).
            - voitureClient instance de la classe Voiture.
        '''
        if abonnement :
            self.abonnement = abonnement
        else :
            self.abonnement = False
          
        self.id = id 
        self.nom = nom
        self.prenom = prenom
        self.adresse = adresse
        self.mail = mail
        self.tel = tel
        self.nbFrequentations = nbFreq
        self.possederTicket = False
        self.voitureClient = voiture
        
    
        
    def getId(self):
        '''
        Methode : accesseur de l'attribut id qui retourne celui-ci.
        '''
        return self.id
    
    def getNom(self):
        '''
        Mehode : accesseur de l'attribut nom qui retourne celui-ci.
        '''
        return self.nom
    
    
    
    def getPrenom(self):
        '''
        Methode : accesseur de l'attribut prenom qui retourne celui-ci.
        '''
        return self.prenom
    
     
    def getMail(self):
        '''
        Methode : accesseur de l'attribut mail qui retourne celui-ci.
        '''
        return self.mail
    
    
    def getTel(self):
        '''
        Methode : accesseur de l'attribut tel qui retourne celui-ci.
        '''
        return self.tel
    
    
    def getAdresse(self):
        '''
        Methode : accesseur de l'attribut adresse qui retourne celui-ci.
        '''
        return self.adresse
    
      
    def getVoiture(self):
        '''
        Methode : accesseur de l'attribut voitureClient qui retourne celui-ci.
        '''
        return self.voitureClient
    
    
    def getAbonnement(self):
        '''
        Methode : accesseur de l'attribut abonnement qui retourne celui-ci.
        '''
        return self.abonnement
    
    def getEstAbonne(self):
        '''
        on retourne True si le client a un abonnement, False sinon.
    
        '''
        if self.abonnement :
            return True
        else :
            return False
    
    
    def getEstSuperAbonne(self):
        '''
        Methode : on retourne True si le client a un abonnement et qu'il est superAbonne, False sinon.
    
        '''
        if self.abonnement and self.abonnement.getEstSuperAbonne():
            return True
        else :
            return False
    
    def setAbonnement(self, abo):
        '''
        Methode : modificateur de l'attribut abonnement qui mofifie celui-ci.
        '''
        self.abonnement = abo
    
    
    def setId(self, id):
        '''
        Methode : modificateur de l'attribut id qui mofifie celui-ci.
        '''
        self.id = id
        
    def recevoirTicket(self, bdd = None):
        '''
        Methode : elle attend une instance de la base de donnees en parametre.
        Un ticket est alors donne avec puis on incremente le nombre de frequentations dans l'attribut 
        et dans la base de donnees.
        '''
        self.possederTicket = True
        freq = self.nbFrequentations
        self.nbFrequentations = freq+1
        if bdd :
            bdd.incrementerNbFreq(self)
            
   
        
    def insererTicket(self):
        '''
        Methode : permet d'inserer un ticket et ainsi de passer possederTicket() a False.
        '''
        self.possederTicket = False
    
    
    def insererCarte(self, bdd):
        '''
        Methode : permet d'inserer la carte d'abonne et de la verifier dans la base de 
        donnees.
        '''
        bdd.verifierCarte(self)
    
    
    def getNbFrequentations(self):
        '''
        Methode : accesseur de l'attribut nbFrequentations qui retourne celui-ci.
        '''
        return self.nbFrequentations
    
    def setDevenirSuperAbo(self, bool):
        '''
        Methode : donne une place attribuee a un superAbonne pour une voiture donne, avec un
        parametre bool passer en parametre de la fonction.
        '''
        self.voitureClient.setPlaceAttribuee(bool)

    
    def getDevenirSuperAbo(self):
        '''
        Methode : Verifie si le client est superAbonne pour lui donner une place attribue a la 
        voiture.
        '''
        return self.voitureClient.getPlaceAttribuee()
    